####第三章 列表

###3.1列表是什么

bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles)

###访问列表元素

#列表是有序集合，因此要访问列表的任何元素，只需将该元素的位置（索引）告诉Python即可
#要访问列表元素，可指出列表的名称，在指出元素的索引，并将后者放在方括号内

#从列表bicycles中提取一款自行车 元素序号从0 开始
bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles[0])#打印trek
print(bicycles[3])#打印 specialized

#当请求获取列表元素时，Python只返回该元素，而不包括方括号[]

#还可以直接对列表元素进行处理
#如让 列表中自行车的牌子首字母大写
print(bicycles[0].title())#打印列表第一个元素，并让首字母大写

##索引从0 开始而不是从1
#访问最后一个人元素，还可以使用索引值 -1
print(bicycles[3])
print(bicycles[-1]) #这两个别表索引都是访问列表最后一个元素

###动手试一试

#练习3.1 姓名

names = ['邱丽冰', '廖畅', '臭狗熊', '廖洁']
print(names[0], names[1], names[2], names[3])

#练习3.2 问候语
message = ', how are you ?'
print(names[0]+message)
print(names[1]+message)
print(names[2]+message)
print(names[3]+message)

#练习3.3 自己的列表

commuting_way = ['motorcycle', 'bicycle', 'car', 'subway', 'bus']
message = 'I would like to own a Honda '
print(message+ commuting_way[0]+'.')

###修改、添加和删除元素
#你创建的列表大多是动态的，这意味列表创建后，将随着程序的运行增删元素。
#例如你可能创建了一个游戏，要求玩家消灭从天而降的外星人。
#为此，可在开始时将一些外星人存储在列表中，然后每当有外星人被消灭时，都将其从列表中删除
#而每次有新的外星人出现在屏幕上时，都将其添加到列表中来

##3.2.1修改列表元素
#修改列表元素的语法与访问列表元素的语法类似。
#要修改列表元素，可指定列表名和要修改的元素索引，再定义该元素的新值

motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)

motorcycles[0] = 'ducati'
print(motorcycles)

##3.2.2在列表中添加元素
#1、在列表末尾添加元素
#在列表中添加新元素时，最简单的方式就是将元素追加（append）到列表末尾。
motorcycles.append('ducati')
print(motorcycles)
#append() 方法让动态地创建列表易如反掌。
#例如，可以先创建一个空列表，然后再用append() 方法依次添加元素

motorcycles = []

motorcycles.append('honda')
motorcycles.append('yamaha')
motorcycles.append('suzuki')

print(motorcycles)

#在列表中插入元素
#2、使用insert() 方法可在列表的任意位置添加新元素
#需要指定新元素的索引和值
motorcycles = ['honda', 'yamaha', 'suzuki']

motorcycles.insert(0, 'ducati')
print(motorcycles)

##3.2.3从列表中删除元素

#1、使用 del 语句删除元素
#如果知道要删除的元素在列表中的位置，可以使用del语句

motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)

del motorcycles[0]
print(motorcycles)

#使用 del删除列表中的值后，会更新列表，你无法再访问该值了
print(motorcycles[0]+'\n')

#2、使用pop() 方法删除元素
#有时候，你要将元素从列表中删除，并接着访问他的值
#pop() 方法删除列表末尾的元素，并让你能够接着使用它
#术语 弹出 pop 源自这样的类比：列表就像一个栈，而删除列表末尾的元素就相当于弹出栈顶元素

#从列表motorcycles 中弹出一款摩托车
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)

popped_motorcycles = motorcycles.pop()
# .pop() 方法同时干了两件事， 1、将列表的最后一个元素删除同时更新列表  2、将被删除的元素保存在一个新变量中
print(motorcycles) #pop() 方法删除了列表的最后一个元素，同时更新了列表
                   #但是可是新建一个变量将这个被删去的元素保留下来，继续使用这个元素
print(motorcycles.pop())

print(popped_motorcycles)

#pop() 方法有什么作用呢？ 假设列表中的摩托车是按时间购买的，就可以使用pop() 方法来打印一条消息，指出最后购买的是那款摩托车
motorcycles = ['honda', 'yamaha', 'suzuki']

last_owned = motorcycles.pop()
print('The last motorcycle I owned was a ' + last_owned.title())
#这条语句等价于
print(f"The last motorcycle I owned was a {last_owned.title()}")

# name = 'LIAO'
# print('hello ' +name+ ', would you like to learn some Python today?')
# print(f"hello {name}, would you like to learn some Python today?")

#3、删除列表中任意位置的元素

#实际上，使用pop() 也可以删除列表中任意位置的元素，只需要在括号中之指定要删除的元素的索引即可

#根据值删除元素 remove() 方法
#有时候，你不知道要从列表中删除的值在哪个位置。如果只知道要删除的元素的值，可使用 remove() 方法
#假设要从列表中删除 motorcycles中删除值 ‘ducati’
motorcycles = ['honda', 'yamaha', 'suzuki', 'ducati']
print(motorcycles)

motorcycles.remove('ducati')
print(motorcycles)

#使用remove() 方法从列表中删除元素后，也可继续使用它的值
#下面删除值‘ducati’并打印一条消息，指出将其从列表中删除的原因

motorcycles = ['honda', 'yamaha', 'suzuki', 'ducati']
print(motorcycles)

too_expensive = 'ducati'
motorcycles.remove(too_expensive)

print('\nA ' +too_expensive+ ' is too expensive for me.')

#注意！！！remove() 方法只删除第一个指定的值，如果要删除的值可能在列表中出现次，就需要使用循环，确保将每个值都删除。

###动手试一试

#练习3.4 嘉宾名单

guest_list = ['廖畅', '邱丽冰', '臭狗熊', '老大', '老二']
name01 = guest_list[1]
name02 = guest_list[3]
name03 = guest_list[4]

message = ' I would like to have a dinner with you!'
print(name01+message)
print(name02+message)
print(name03+message)

#练习3.5

print(name02+ ' can not attend.')
guest_list[3] = '妈妈'
print(guest_list)

name01 = guest_list[1]
name02 = guest_list[3]
name03 = guest_list[4]

message = ' I would like to have a dinner with you!'
print(name01+message)
print(name02+message)
print(name03+message)

#练习3.6 添加嘉宾

print('I bought a bigger table, so I can visit more people to have a dinner with me!')
guest_list.insert(0,'老爸')
guest_list.insert(3, '爷爷')
guest_list.append('奶奶')
print(guest_list)

print(guest_list[0]+message)
print(guest_list[1]+message)
print(guest_list[2]+message)
print(guest_list[3]+message)
print(guest_list[4]+message)
print(guest_list[5]+message)
print(guest_list[6]+message)
print(guest_list[7]+message)

##练习3.7 缩短名单

print('Sorry, my newly bought table was not delivered in time, so I can only invite two guest to have a dinner with me.')

popped_name = guest_list.pop(0)
print('Sorry '+ popped_name + ', I con not have a dinner with you.')
# popped_name02 = guest_list.pop(1)
popped_name = guest_list.pop(0)
print('Sorry '+ popped_name + ', I con not have a dinner with you.')
# popped_name03 = guest_list.pop(3)
popped_name = guest_list.pop(1)
print('Sorry '+ popped_name + ', I con not have a dinner with you.')
# popped_name04 = guest_list.pop(4)
popped_name = guest_list.pop(1)
print('Sorry '+ popped_name + ', I con not have a dinner with you.')
# popped_name05 = guest_list.pop(6)
popped_name = guest_list.pop(2)
print('Sorry '+ popped_name + ', I con not have a dinner with you.')
# popped_name06 = guest_list.pop(7)
popped_name = guest_list.pop(2)
print('Sorry '+ popped_name + ', I con not have a dinner with you.')

#注意，由于每一次pop了列表，列表均会更新，故必须每次对新的列表进行操作

print(guest_list)
print(guest_list[0]+', I would like to have a dinner with you!')
print(guest_list[1]+', I would like to have a dinner with you!')

del guest_list[0]
del guest_list[0]
print(guest_list)
print('名单已经清空！')